/**********************************************************************
 * Filename: Participacao.java
 * Created: 2012/04/30
 * @author Fernando Brito e Abreu
 **********************************************************************/
package org.bunny.businessLayer;

import java.util.Set;
import java.util.HashSet;

public class Participacao{
	public static Set<Participacao> allInstances = new HashSet<Participacao>();

	private int classificacao;
	private boolean organizador;
	private Campeonato participado;
	private Pais participante;
	private Set<Jogador> plantel =  new HashSet<Jogador>();
	private Treinador treinador;

	/**********************************************************************
	 * Default constructor
	 **********************************************************************/
	public Participacao(){
		allInstances.add(this);
	}

	/**********************************************************************
	 * Parameterized constructor
	 * @param classificacao the classificacao to initialize
	 * @param organizador the organizador to initialize
	 * @param participado the participado to initialize
	 * @param participante the participante to initialize
	 * @param plantel the plantel to initialize
	 * @param treinador the treinador to initialize
	 **********************************************************************/
	public Participacao(int classificacao, boolean organizador, Campeonato participado, Pais participante, Set<Jogador> plantel, Treinador treinador){
		this.classificacao = classificacao;
		this.organizador = organizador;
		this.participado = participado;
		this.participante = participante;
		this.plantel = plantel;
		this.treinador = treinador;
		allInstances.add(this);
	}


	/**********************************************************************
	 * Standard attribute getter
	 * @return the classificacao of the participacao
	 **********************************************************************/
	public int classificacao(){
		return classificacao;
	}

	/**********************************************************************
	 * Standard attribute setter
	 * @param classificacao the classificacao to set
	 **********************************************************************/
	public void setClassificacao(int classificacao){
		this.classificacao = classificacao;
	}

	/**********************************************************************
	 * Standard attribute getter
	 * @return the organizador of the participacao
	 **********************************************************************/
	public boolean organizador(){
		return organizador;
	}

	/**********************************************************************
	 * Standard attribute setter
	 * @param organizador the organizador to set
	 **********************************************************************/
	public void setOrganizador(boolean organizador){
		this.organizador = organizador;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER getter for Participacao[*] <-> Campeonato[1]
	 * @return the participado of the participacao
	 **********************************************************************/
	public Campeonato participado(){
		return participado;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER setter for Participacao[*] <-> Campeonato[1]
	 * @param participado the participado to set
	 **********************************************************************/
	public void setParticipado(Campeonato participado){
		this.participado = participado;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER getter for Participacao[*] <-> Pais[1]
	 * @return the participante of the participacao
	 **********************************************************************/
	public Pais participante(){
		return participante;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER setter for Participacao[*] <-> Pais[1]
	 * @param participante the participante to set
	 **********************************************************************/
	public void setParticipante(Pais participante){
		this.participante = participante;
	}

	/**********************************************************************
	 * MANY2MANY getter for Participacao[*] <-> Set(Jogador)[*]
	 * @return the plantel of the participacao
	 **********************************************************************/
	public Set<Jogador> plantel(){
		return plantel;
	}

	/**********************************************************************
	 * MANY2MANY setter for Participacao[*] <-> Set(Jogador)[*]
	 * @param plantel the plantel to set
	 **********************************************************************/
	public void setPlantel(Set<Jogador> plantel){
		this.plantel = plantel;
	}

	/**********************************************************************
	 * ONE2MANY getter for Participacao[*] <-> Treinador[1]
	 * @return the treinador of the participacao
	 **********************************************************************/
	public Treinador treinador(){
		return treinador;
	}

	/**********************************************************************
	 * ONE2MANY setter for Participacao[*] <-> Treinador[1]
	 * @param treinador the treinador to set
	 **********************************************************************/
	public void setTreinador(Treinador treinador){
		this.treinador = treinador;
	}

	/**********************************************************************
	 * User-defined operation specified in SOIL/OCL
	 * @param nome the nome to set
	 * @param data_nasce the data_nasce to set
	 * @param posicao the posicao to set
	 * @param nacionalidade the nacionalidade to set
	 * @param joga_clube the joga_clube to set
	 * @param joga_pais the joga_pais to set
	 **********************************************************************/
	public void adicionaJogador(String nome, String data_nasce, PosicaoJogador posicao, Pais nacionalidade, String joga_clube){
		//	TODO
		CalendarDate data_nascimento = new CalendarDate();
		data_nascimento.stringToDate(data_nasce);
		
	
		Clube c = null; 

		for (Clube x : Clube.allInstances){	
				if(x.nome() == null){//TODO
					x.setNome("FAKE");
				}
				if(x.nome().equals(joga_clube)){
					c = x;
					break;
				}
		}

		if(c == null){
			c = new Clube(joga_clube,nacionalidade);
		}

		Jogador a = new Jogador(data_nascimento, nome, nacionalidade,  posicao, c);
		Jogador.allInstances.add(a);
		data_nascimento.destroy();
		//	jogador := new Jogador;
		//	 dummy := new CalendarDate;
		//	 data_nascimento := dummy.stringToDate(data_nasce);
		//	 destroy dummy;
		//	 clube := Clube.allInstances->select(c : Clube | (c.nome = joga_clube))->asSequence->first;
		//	 if clube.isUndefined then clube := new Clube;
		//	 clube.inicializa(joga_clube, joga_pais) end;
		//	 insert (jogador,self) into Jogador_Participacao;
		//	 jogador.inicializa(nome, data_nascimento, posicao, nacionalidade, clube);
	}



	//	PRE-CONDITIONS (TODO)
	/*
	pre ArgumentosAddJogadorForamInicializados
		(((((nome.isDefined and data_nasce.isDefined) and posicao.isDefined) and nacionalidade.isDefined) and joga_clube.isDefined) and joga_pais.isDefined)

	 */

	/**********************************************************************
	 * User-defined operation specified in SOIL/OCL
	 **********************************************************************/
	public void organiza(){
		this.organizador = true;

		//	self.organizador := true;
	}

	//	POST-CONDITIONS (TODO)
	/*
	post OrganizadorInicializado
		self.organizador.isDefined

	 */

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	/**********************************************************************
	 * Object serializer
	 **********************************************************************/
	public String toString(){
		return "Participacao [classificacao=" + classificacao + ", organizador=" + organizador + ", participado=" + participado + ", participante=" + participante + ", plantel=" + plantel + ", treinador=" + treinador + "]\n";
	}

	//	-------------------------------------------------------------------------------
	//	INVARIANTS (TODO)
	/*
	inv JogadorTemMesmaNacionalidadeDoPaisQueRepresenta
		self.plantel->forAll(j : Jogador | (j.nacionalidade = self.participante))

	inv JogadorSoJogaPorUmPais
		(self.plantel->collectNested($e : Jogador | $e.participacoes)->flatten->collectNested($e : Participacao | $e.participante)->asSet->size = 1)

	 */
}
